iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0
Software Development

從 Vibe Coding 到可維護專案:用 Hermes Agent 重讀 RoomRush Android 專題系列 第 18 篇

Day 18 | 管理者登入看起來能用,但安全性真的夠嗎?

  • 分享至 

  • xImage
  •  

前言:管理者登入怎麼做?後台入口是否有足夠保護?

前一天探究了 App 其中之一的技術債-管理者修改可能被 CSV 重新匯入覆蓋,這帶出了今天要正式進入到的主題--「管理者功能線」。

今天要讀的檔案是 LoginActivity.kt,顧名思義就是登入功能,當初我們小組是利用輸入帳號密碼的方式來進入管理者功能。然而,因為當初設計較粗略,不能說有足夠的保護。登入功能還需要考慮哪些點?今天就讓我們一探究竟。


一開始我認為

一開始我們組內其實是在完成管理者功能後,才發現還沒有設計進入這項功能的入口。因此,我們想說:那就直接在首頁加上按鈕,當管理者登入時,就可以操作管理者裡面的功能。

不過因為當初沒有想太多,我們其實是直接把帳號密碼用硬編碼寫在程式碼裡面,但其實這個方法是不太安全的。

UI 畫面 操作流程
UI 畫面 操作流程

實際讀完後,LoginActivity.kt 負責什麼

和 Hermes Agent 一起重讀 LoginActivity.kt 後,我知道它是管理者功能的入口,負責顯示登入頁、取得帳密、驗證帳密、登入成功後記錄狀態、跳轉到 ManagerActivity(管理者功能)、登入失敗顯示錯誤。

程式碼中的核心邏輯有以下:

1. 硬編碼帳密

private val ADMIN_USER = "xxxx"
private val ADMIN_PASS = "xxxx"
  • 邏輯說明:ADMIN_USER 是帳號,ADMIN_PASS 是密碼,以硬編碼的方式寫死
  • 架構與資安漏洞:
    1. 容易被逆向工程破解: APK 經反編譯後,明文密碼會直接曝光,存在極高資安風險。
    2. 維護與權限彈性極低: 只要想修改密碼或新增管理員,就必須重新編譯並發布新版 App,無法做到動態權限控管與安全審查。

2. 載入登入頁與綁定 UI

setContentView(R.layout.activity_login)

val etUsername = findViewById<EditText>(R.id.etUsername)
val etPassword = findViewById<EditText>(R.id.etPassword)
val btnLogin = findViewById<Button>(R.id.btnLogin)
val btnExit = findViewById<Button>(R.id.btnExit)
  • 技術細節:這段把 activity_login.xml 設為畫面,並取得帳號輸入框、密碼輸入框、登入按鈕與離開按鈕。

3. 登入按鈕邏輯

btnLogin.setOnClickListener {
    val user = etUsername.text.toString()
    val pass = etPassword.text.toString()

    if (user == ADMIN_USER && pass == ADMIN_PASS) {
        val pref = getSharedPreferences("LoginData", Context.MODE_PRIVATE)
        pref.edit().putBoolean("isLoggedIn", true).apply()

        Toast.makeText(this, "登入成功", Toast.LENGTH_SHORT).show()
        goToManagerPage()
    } else {
        Toast.makeText(this, "帳號或密碼錯誤", Toast.LENGTH_SHORT).show()
    }
}
  • 邏輯說明:按下登入後,程式讀取輸入文字並和預設帳密比對。成功時寫入登入狀態並跳轉,失敗時顯示錯誤提示。

4. 跳到管理者頁面

private fun goToManagerPage() {
    val intent = Intent(this, ManagerActivity::class.java)
    startActivity(intent)
    finish()
}
  • 邏輯說明:登入成功後開啟 ManagerActivity,並用 finish() 關閉登入頁,避免使用者按返回又回到 LoginActivity。

它接在哪一條流程上

MainActivity
    ↓
點擊「管理」
    ↓
LoginActivity
    ↓
顯示管理者登入頁
    ↓
輸入帳號 / 密碼
    ↓
驗證登入資訊
    ↓
驗證成功?
    ├── 否 → 顯示 Toast
    │
    └── 是
         ↓
       isLoggedIn = true
         ↓
       ManagerActivity
         ↓
       進入管理者功能

Hermes Agent 幫我檢查出的重點

LoginActivity 是 RoomRush 管理者功能的入口頁。

  • 使用者從 MainActivity 的 Manage 按鈕進入登入頁後,程式會讀取帳號與密碼輸入框的文字,並與硬編碼的 ADMIN_USER、ADMIN_PASS 比對。
  • 登入成功時,會用 SharedPreferences 在 LoginData 中寫入 isLoggedIn = true,顯示登入成功提示,然後開啟 ManagerActivity 並關閉登入頁。
  • 登入失敗時,只顯示帳號或密碼錯誤,不跳頁也不記錄登入狀態。

這個檔案本身不修改資料庫,但它是進入管理者資料維護功能的入口,因此後面要觀察管理者修改資料是否會被 CSV 重新匯入覆蓋。


這個檔案帶出的維護觀察

  1. 原始碼洩漏風險:帳密直接以明文字串寫在前端程式碼中,只要有人將 APK 進行反編譯(Decompile),就能直接取得憑證。
  2. 帳號密碼硬編碼在 App:只要想更新密碼,就必須回到程式碼修改代碼、重新打包編譯,甚至重新釋出新版 APK,完全無法應對緊急更換密碼的需求。
  3. 無法支援多帳號與權限管理:所有管理者共用同一組死板的帳密,無法依角色切換權限,一旦某個成員離職或權限異動,也無法單獨撤銷或凍結帳號。
  4. 缺乏 Session 驗證與過期機制:沒有搭配後端 Token(如 JWT)或登入時效驗證,無法主動踢除異常連線,也無法追蹤後台操作是誰執行的。

小結

進入管理者功能主線時,我先讀了 LoginActivity。這個檔案的角色很清楚:它是管理者功能的守門員。使用者從首頁按下 Manage 後,會進入登入頁,輸入帳號與密碼,通過驗證後才會進入 ManagerActivity。

這裡也出現了第一個管理者功能的技術債:帳號和密碼直接硬編碼在 App 裡。對課堂專案或展示來說可以理解,但如果是正式產品,這樣的做法不安全,也不方便管理多個帳號或權限。

另一個值得追下去的點是登入成功後會寫入 isLoggedIn = true,所以後面需要檢查 ManagerActivity 是否真的有驗證登入狀態,以及是否有登出機制。

一句話重點總結:

LoginActivity 是管理者功能的入口守門員,負責驗證帳密、記錄登入狀態,並在成功後跳到 ManagerActivity。


下一篇預告:進入後台之後,管理者其實有三條功能線

介紹完管理者功能的入口之後,雖然內容比較簡單,但有一點缺陷需要調整。

下一個我們會正式進入到管理者選項頁面-ManagerActivity.kt,登入成功後進入的管理者主頁提供哪些功能入口?

其中和登入系統中有很大的相關聯是 有沒有檢查 isLoggedIn?以及 **有沒有登出機制?**下一篇我們會來揭曉這層面紗。


上一篇
Day 17 | 我發現一個危險問題:管理者修改可能被 CSV 蓋掉
下一篇
Day 19 | 進入後台之後,管理者其實有三條功能線
系列文
從 Vibe Coding 到可維護專案:用 Hermes Agent 重讀 RoomRush Android 專題 共 23 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言